package com.china.cnlongdb.server.operator.update;

import java.util.ArrayList;
import java.util.Date;
import java.util.Iterator;
import java.util.List;
import java.util.Map;

import org.apache.commons.collections.CollectionUtils;
import org.apache.commons.lang3.StringUtils;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;

import com.china.cnlongdb.basic.constant.ConcurrentDataMap;
import com.china.cnlongdb.basic.constant.LongDbConstant;
import com.china.cnlongdb.basic.entity.database.LongTableEntity;
import com.china.cnlongdb.basic.entity.query.LongDbQuery;
import com.china.cnlongdb.basic.entity.update.LongDbUpdate;
import com.china.cnlongdb.basic.entity.update.UpdateDateEntity;
import com.china.cnlongdb.basic.utils.FieldHandlerUtils;
import com.china.cnlongdb.server.connect.LongDbConnect;

/**
 * 系统名称：UpdateOperator.java
 * 模块名称：
 * 模块描述：longdb - 更新操作服务实现层
 * 功能列表：
 * 模块作者：ZOUYONG
 * 开发时间：2018年12月5日 下午10:01:51
 * 模块路径：com.china.cnlongdb.server.operator.update.UpdateOperator
 * 更新记录：
 */
public class UpdateOperator {

	private final Logger logger = (Logger) LoggerFactory.getLogger(UpdateOperator.class);
	
	// 数据库连接对象
	private LongDbConnect connect;
	public UpdateOperator(LongDbConnect connect) {
		logger.debug(LongDbConstant.longdbDefaultName + "初始化[修改执行器]...");
		this.connect = connect;
	}

	/**
	 * 功能描述：更新数据库表中数据
	 * 模块作者：ZOUYONG
	 * 开发时间：2018年11月11日 下午12:55:06
	 * 更新记录：
	 * 返回数据：boolean
	 */
	public boolean update(LongDbQuery query, LongDbUpdate update) throws Exception {
		
		if(null == query || null == update || null == query.getClassz()) {
			return false;
		}
		Map<String, Object> updateMap = update.getUpdateMap();
		if(null == updateMap || updateMap.size() <= 0) {
			return false;
		}

		Class<?> cls = query.getClassz();
		String tableName = StringUtils.isBlank(query.getTableName()) ? cls.getSimpleName() : query.getTableName();
		if(StringUtils.isBlank(tableName)) {
			tableName = cls.getSimpleName();
		}
		LongTableEntity table = connect.getCreateOperator().getLongTableByName(tableName);
		if(null == table) {
			return false;
		}
		
		List<String> list = connect.getQueryOperator().getTableContentJson(query, cls, tableName);
		if(CollectionUtils.isEmpty(list)) {
			return false;
		}
		List<String> newList = new ArrayList<String>();
		for (String json : list) {
			Map<String, Object> object = FieldHandlerUtils.parserLongStrToMap(json);
			object.put(LongDbConstant.longdbTableUpdateDate, new Date().getTime());
			for(Iterator<String> iter = updateMap.keySet().iterator(); iter.hasNext(); ) {
				String key = iter.next();
				Object value = updateMap.get(key);
				Object oldVal = object.get(key);
				if(null == oldVal || StringUtils.isBlank(oldVal.toString())) {
					continue;
				} else {
					object.put(key, value);
				}
			}
			newList.add(FieldHandlerUtils.parserLongMapToStr(object));
		}

		executeUpdateData(newList, tableName);
		
		return true;
	}

	/**
	 * 功能描述：根据条件，全部更新，慎用
	 × 模块作者：ZOUYONG
	 × 开发时间：2019年4月15日 下午5:41:43
	 × 返回数据：boolean
	 */
	public boolean update(LongDbQuery query, Object object) throws Exception {

		if(null == query || null == query.getClassz()) {
			return false;
		}

		Class<?> cls = query.getClassz();
		String tableName = StringUtils.isBlank(query.getTableName()) ? cls.getSimpleName() : query.getTableName();
		if(StringUtils.isBlank(tableName)) {
			tableName = cls.getSimpleName();
		}
		LongTableEntity table = connect.getCreateOperator().getLongTableByName(tableName);
		if(null == table) {
			return false;
		}
		
		List<String> list = connect.getQueryOperator().getTableContentJson(query, cls, tableName);
		if(CollectionUtils.isEmpty(list)) {
			return false;
		}

		List<String> newList = new ArrayList<String>();
		for (String json : list) {
			Map<String, Object> objMap = FieldHandlerUtils.parserLongStrToMap(json);
			objMap.put(LongDbConstant.longdbTableUpdateDate, new Date().getTime());

			Map<String, Object> newMap = FieldHandlerUtils.parserLongObjectToMap(object);
			objMap.putAll(newMap);
			newList.add(FieldHandlerUtils.parserLongMapToStr(objMap));
		}

		executeUpdateData(newList, tableName);
		
		return true;
	}

	private void executeUpdateData(List<String> newList, String tableName) throws Exception {
		// 获取当前的事务名称
		String transactionName = Thread.currentThread().getName();
		boolean isOpenTrans = StringUtils.isNotBlank(transactionName) && transactionName.endsWith(LongDbConstant.longdbTranscationFlag);
		try {
			// 属性值修改完成，重新写入文件
			for (String jsonStr : newList) {
				UpdateDateEntity updDelData = new UpdateDateEntity();
				updDelData.setDataContent(jsonStr);
				updDelData.setTableName(tableName);
				updDelData.setRemoveOrUpdate(false);
				if(isOpenTrans) { // 开启事务
					List<UpdateDateEntity> updDelDataList = ConcurrentDataMap.tempUpdDelDataMap.get(transactionName);
					if(null == updDelDataList) {
						updDelDataList = new ArrayList<UpdateDateEntity>();
					}
					updDelDataList.add(updDelData);
					ConcurrentDataMap.tempUpdDelDataMap.put(transactionName, updDelDataList);
				}
				// 未开启事务
				else {
					connect.getRemoveOperator().updateTableFileLineData(updDelData);
				}
			}
		} catch(Exception e) {
			throw e;
		}
	}

}
